package models.vo {

  import com.axon.base.helpers.AxUtils;

  import mx.collections.ArrayCollection;

  import org.restfulx.collections.ModelsCollection;
  import org.restfulx.models.RxModel;

  [Resource(name="caracterizacoes")]

  [Bindable]
  public class Caracterizacao extends RxModel {
    public static const LABEL:String = "id";

    public var infraEstrutura:Boolean;

    public var adicionalFreteRenovacao:Boolean;

    public var iofCambioImportacao:Boolean;

    public var depreciacaoAcelerada:Boolean;

    public var descontoPisPasepCofins:Boolean;

    public var reinvestimentoParcelado:Boolean;

    public var objetivo:String;

    public var mercadoAtuacao:String;

    public var tipoProjeto:String;

    [BelongsTo]
    public var pleito:Pleito;

    [HasMany]
    public var atividades:ModelsCollection;

    [HasMany]
    public var produtosServicos:ModelsCollection;

    [HasMany]
    public var mercadorias:ModelsCollection;

    [HasMany]
    public var depreciaveis:ModelsCollection;

    [HasMany(through="bens")]
    public var bens:ModelsCollection;

    [HasMany]
    public var investimentos:ModelsCollection;

    [HasMany]
    public var depositos:ModelsCollection;

    [HasMany]
    public var opcoesDipj:ModelsCollection;

    [Ignored]

    public var depositosTotal:Number = 0; // A

    [Ignored]

    public var previsaoOuComplementacao:Number = 0; // B

    [Ignored]

    public var previsaoDeReducao:Number = 0; // b1

    [Ignored]

    public var previsaoDaComplementacao:Number = 0; // b2

    [Ignored]

    public var investimentosTotal:Number = 0; // C

    [Ignored]
    public var custoAdministracao:Number = 0; // D

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function Caracterizacao() {
      super(LABEL);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getAtividades():ModelsCollection {
      if (!atividades)
        atividades = new ModelsCollection();

      return atividades;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getProdutosServicos():ModelsCollection {
      if (!produtosServicos)
        produtosServicos = new ModelsCollection();

      return produtosServicos;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getMercadorias():ModelsCollection {
      if (!mercadorias)
        mercadorias = new ModelsCollection();

      return mercadorias;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getDepreciaveis():ModelsCollection {
      if (!depreciaveis)
        depreciaveis = new ModelsCollection();

      return depreciaveis;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getInvestimentos():ModelsCollection {
      if (!investimentos)
        investimentos = new ModelsCollection();

      return investimentos;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getDepositos():ModelsCollection {
      if (!depositos)
        depositos = new ModelsCollection();

      return depositos;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getOpcoesDipj():ModelsCollection {
      if (!opcoesDipj)
        opcoesDipj = new ModelsCollection();

      return opcoesDipj;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getAtividadeById(id:String):Atividade {
      var result:Atividade = new Atividade();

      getAtividades();

      for (var i:int = 0; i < atividades.length; i++) {
        if (Atividade(atividades.getItemAt(i)).id == id) {
          result = Atividade(atividades.getItemAt(i));
          break;
        }
      }
      return result;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getProdutoServicoById(id:String):ProdutoServico {
      var result:ProdutoServico = new ProdutoServico();

      getProdutosServicos();

      for (var i:int = 0; i < produtosServicos.length; i++) {
        if (ProdutoServico(produtosServicos.getItemAt(i)).id == id) {
          result = ProdutoServico(produtosServicos.getItemAt(i));
          break;
        }
      }
      return result;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getProdInsumoTreeData():Object {
      var dataObject:Object = [{type: "root", id: "-1", label: "Produtos", children: []}];
      var prodObject:Object = null;
      var prodCollection:ModelsCollection = getProdutosServicos();
      var insumoCollection:ModelsCollection = null;

      for each (var prod:ProdutoServico in prodCollection) {

        prodObject = {type: "produto", id: prod.id, label: prod.getDescricaoAnalista(), children: []};
        dataObject[0].children.push(prodObject);

        insumoCollection = prod.getMercadorias();

        for each (var insumo:Mercadoria in insumoCollection)
          prodObject.children.push({type: "insumo", id: insumo.id, label: insumo.descricao, produtoServico_id: prod.id});

        prodObject.children.sort(sortOnLabel);
      }

      dataObject[0].children.sort(sortOnLabel);

      return dataObject;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getAtivProdTreeData(mnemonicIncentivo:String):Object {
      var dataObject:Object = [{type: "root", id: "-1", label: "Atividades e Produtos", children: []}];
      var ativObject:Object = null;
      var ativCollection:ModelsCollection = getAtividades();
      var prodCollection:ModelsCollection = null;

      for each (var ativ:Atividade in ativCollection) {

        if (!ativ.algumProdutoAtendeCondicao && mnemonicIncentivo != "red_12_5_irpj")
          continue;

        ativObject = {type: "atividade", id: ativ.id, label: ativ.getDescricaoAnalista(), children: []};
        dataObject[0].children.push(ativObject);

        prodCollection = ativ.getProdutos();

        for each (var prod:Produto in prodCollection) {
          if (!prod.condicaoAtendida && mnemonicIncentivo != "red_12_5_irpj")
            continue;
          ativObject.children.push({type: "produto", id: prod.id, label: prod.getDescricaoAnalista(), atividade_id: ativ.id});
        }

        ativObject.children.sort(sortOnLabel);
      }

      dataObject[0].children.sort(sortOnLabel);

      return dataObject;
    }

    private function sortOnLabel(a:Object, b:Object):Number {
      var aLabel:String = AxUtils.axUpperCase(a.label);
      var bLabel:String = AxUtils.axUpperCase(b.label);

      if (aLabel > bLabel)
        return 1
      else if (aLabel < bLabel)
        return -1
      else
        return 0;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get totalInvestimentos():Number {
//      var ac:ArrayCollection = getInvestimentos();
//      var total:Number = 0;
//      for each (var item:Investimento in ac) {
//        total += item.valor;
//      }
//      return total;
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get totalInvRealizados():Number {
//      var ac:ArrayCollection = getInvestimentos();
//      var total:Number = 0;
//      for each (var item:Investimento in ac) {
//        if (item.documentoFiscal)
//          total += item.valor;
//      }
//      return total;
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get totalInvARealizar():Number {
      var ac:ArrayCollection = getInvestimentos();
      var total:Number = 0;
      for each (var item:Investimento in ac) {
        if (!item.documentoFiscal)
          total += item.valor;
      }
      return total;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get totalNF():Number {
      var ac:ArrayCollection = new ArrayCollection;
      var total:Number = 0;
      for each (var investimento:Investimento in getInvestimentos()) {
        if (investimento.documentoFiscal && ac.getItemIndex(investimento.documentoFiscal) == -1)
          ac.addItem(investimento.documentoFiscal);
      }
      for each (var item:DocumentoFiscal in ac) {
        total += item.valor;
      }
      return total;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get totalDepositos():Number {
//      var ac:ArrayCollection = getDepositos();
//      var total:Number = 0;
//      for each (var item:Deposito in ac) {
//        total += item.valor + item.complementacao;
//      }
//      return total;
//      return Math.floor(totalOpcoesDipj * 150) / 100;
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get totalOpcoesDipj():Number {
      var ac:ArrayCollection = getOpcoesDipj();
      var total:Number = 0;
      for each (var item:OpcaoDipj in ac) {
        total += item.reducao;
      }
      return total;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get totalOpcoesDipjMais50Porcento():Number {
//      return Math.floor(totalOpcoesDipj * 150) / 100;
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get previsaoExerciciosFuturos():Number {
//      return Math.max(0, (totalInvestimentos / 0.98) - totalDepositos);
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get previsaoReducao():Number {
//      return Math.max(0, (2 * previsaoExerciciosFuturos) / 3);
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get previsaoComplementacao():Number {
//      return Math.max(0, previsaoExerciciosFuturos - previsaoReducao);
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get custoAdministracao():Number {
//      return 0.02 * (reinvestimentoParcelado ? (totalOpcoesDipjMais50Porcento + previsaoExerciciosFuturos) : totalOpcoesDipjMais50Porcento);
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

//    public function get recursosProprios():Number {
//      return Math.max(0, totalInvestimentos + custoAdministracao - totalOpcoesDipjMais50Porcento);
//    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function isAmpliacaoOuModernizacaoParcial():Boolean {
      return (("ampliacao,modernizacao_parcial").indexOf(tipoProjeto) != -1);
    }
  }

}
